// 引入其他类
import Food from './Food.js';
import ScorePanel from './ScorePanel.js';
import Snake from './Snake.js'

// 游戏控制器,控制其它啊所有类;
var _this;
 class GameControl{
	
	 constructor() {
		 _this = this
	    // 定义三个属性;
		// 蛇
		this.snake = new Snake();
		// 食物
		this.food = new Food('.content');
		// 计分器
		this.scorePanel = new ScorePanel(8,2);
		// 定义一个接受键盘的值;
		this.direction = '';
		// isLive:返回 boolean 值; 这里用来设置游戏是否结束;
		this.isLive = true;
		this.init();
	 }
	 // 游戏初始化 调用后游戏开始;
	 init(){
		 document.addEventListener('keydown',this.KeyEvent.bind(this));
		 this.run();
	 }
	 // 键盘事件;
	 /* 
		上:	ArrowUp
		下:	ArrowDown
		左: ArrowLeft
		右: ArrowRight
	 */
	 KeyEvent(e){
		 // 判断e.key是否合法;
		 let event = (e.key == "ArrowUp"||e.key == "ArrowDown"||e.key == "ArrowLeft"||e.key == "ArrowRight")
		 if(event){
			 this.direction = e.key;
			 // 当执行这条语句时 则暂停;
		 }else if(e.key == 's'){
			 // 将键盘 S 给 this.direction
			 this.direction = e.key;
			 if(this.direction){
				alert('嘻嘻！ 正在暂停中; 点击确定, 按下任意方向键继续Game')
				// throw new Error('结束');
			} 
		 }
		 // 将鼠标按下值给 direction;
		 
	 }
	 // 定义蛇跑的方法
	 
	 run(){
		 // 获取蛇的坐标;
		let X = this.snake.X;
		let Y = this.snake.Y;
		
		 switch(this.direction){
		// 向上移动;
			 case "ArrowUp":
			 case "Up": 
				 Y -= 10;
				 break;
		// 向上移动;		 
			 case "ArrowDown":
			 case "Down":
				 Y += 10;
				 break;
		// 向左移动;
			 case "ArrowLeft":
			 case "Left":
			 	 X -= 10;
			 	 break;
		// 向右移动;
			 case "ArrowRight":
			 case "Right":
			 	 X += 10;
			 	 break;
		 }
		// 调用蛇吃食物方法
		 
		this.checkEat();
		try{
			this.snake.X = X;
			this.snake.Y = Y;
		}catch(e){
			alert(e.message + 'GAME OVER');
			// 执行后 返回false: 游戏结束;
			this.isLive = false;
		}
		this.isLive && setTimeout(this.run.bind(this),240 - (this.scorePanel.G - 1) * 30);
	 }
	 // 定义吃食物方法;
	 checkEat(){
		 // 当 蛇头位置和食物位置相同时 则执行以下代码;
		 if(this.snake.X === this.food.X && this.snake.Y === this.food.Y){
			 console.log('食物吃到了');
			 // 调用食物变动方法;
			 this.food.chang();
			 // 分数增加一分;;
			 this.scorePanel.addScore();
			 // 蛇身增加一节;
			 this.snake.addSnake()
			  console.log(this.snake.snake_child.length);
		 }
	 }
 }
 export default GameControl;